home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet multimedia / Muzyka / Edytory sampli (probek dzwieku) / ZynAddSubFX_2.2.0 / Setup_ZynAddSubFX-2.2.0.exe / source code / UI / OscilGenUI.fl < prev    next >
Text File  |  2005-03-14  |  34KB  |  1,132 lines

  1. # data file for the Fltk User Interface Designer (fluid)
  2. version 1.0106 
  3. header_name {.h} 
  4. code_name {.cc}
  5. decl {//Copyright (c) 2002-2005 Nasca Octavian Paul} {} 
  6.  
  7. decl {//License: GNU GPL version 2} {} 
  8.  
  9. decl {\#include "../Synth/OscilGen.h"} {public
  10.  
  11. decl {\#include "../Misc/Util.h"} {public
  12.  
  13. decl {\#include "../Misc/Master.h"} {public
  14.  
  15. decl {\#include "ResonanceUI.h"} {public
  16.  
  17. decl {\#include <FL/Fl_Box.H>} {public
  18.  
  19. decl {\#include <FL/Fl_Group.H>} {public
  20.  
  21. decl {\#include <FL/Fl_Slider.H>} {public
  22.  
  23. decl {\#include <math.h>} {} 
  24.  
  25. decl {\#include <stdio.h>} {} 
  26.  
  27. decl {\#include <stdlib.h>} {} 
  28.  
  29. decl {\#include <string.h>} {} 
  30.  
  31. decl {\#include "WidgetPDial.h"} {public
  32.  
  33. decl {\#include "EnvelopeUI.h"} {public
  34.  
  35. decl {\#include "LFOUI.h"} {public
  36.  
  37. decl {\#include "FilterUI.h"} {public
  38.  
  39. decl {\#include "PresetsUI.h"} {public
  40.  
  41. class OscilSpectrum {: {public Fl_Box}
  42. } {
  43.   Function {OscilSpectrum(int x,int y, int w, int h, const char *label=0):Fl_Box(x,y,w,h,label)} {} {
  44.     code {oscil=NULL;} {}
  45.   }
  46.   Function {init(OscilGen *oscil_,int oscbase_,Master *master_)} {} {
  47.     code {oscil=oscil_;
  48. oscbase=oscbase_;
  49. master=master_;} {}
  50.   }
  51.   Function {draw()} {} {
  52.     code {int ox=x(),oy=y(),lx=w(),ly=h(),i;
  53. const int maxdb=60;//must be multiple of 10
  54. int GX=2;
  55. int n=lx/GX-1;
  56. if (n>OSCIL_SIZE/2) n=OSCIL_SIZE/2;
  57.  
  58. REALTYPE x;
  59. REALTYPE spc[n];
  60. for (i=0;i<n;i++) spc[i]=0.0;
  61.  
  62. pthread_mutex_lock(&master->mutex);
  63. if (oscbase==0) oscil->getspectrum(n,spc,0);
  64.     else oscil->getspectrum(n,spc,1);
  65. pthread_mutex_unlock(&master->mutex);
  66.  
  67. //normalize
  68. REALTYPE max=0;
  69. for (i=0;i<n;i++){
  70.    x=fabs(spc[i]);
  71.    if (max<x) max=x;
  72. }
  73. if (max<0.000001) max=1.0;
  74. max=max*1.05;
  75.  
  76. //draw
  77.  
  78. if (this->active_r()) fl_color(this->parent()->selection_color());
  79.     else fl_color(this->parent()->color());
  80. fl_line_style(FL_DOT);
  81.  
  82. for (i=1;i<maxdb/10;i++){
  83.   int ky=(int)((REALTYPE)i*ly*10.0/maxdb)/2;
  84.   ky*=2;
  85.   fl_line(ox,oy+ky-1,ox+lx-2,oy+ky-1);
  86. };
  87.  
  88. for (i=2;i<n;i++){
  89.     int tmp=i*GX-2;
  90.     if (i%10==1) fl_line_style(0);
  91.        else fl_line_style(FL_DOT);
  92.     fl_line(ox+tmp,oy+2,ox+tmp,oy+ly-2);
  93. }
  94.  
  95. if (this->active_r()) fl_color(this->parent()->labelcolor());
  96.     else fl_color(this->parent()->color());
  97. fl_line_style(0);
  98.  
  99. //draws the spectrum
  100. for (i=0;i<n;i++){
  101.    int tmp=i*GX+2;
  102.    x=spc[i]/max;
  103.    
  104.    if (x>dB2rap(-maxdb)) x=rap2dB(x)/maxdb+1;
  105.        else x=0;
  106.  
  107.    int val=(int) ((ly-2)*x);
  108.    if (val>0) fl_line(ox+tmp,oy+ly-2-val,ox+tmp,oy+ly-2);
  109. };} {}
  110.   }
  111.   decl {OscilGen *oscil;} {}
  112.   decl {int oscbase;} {}
  113.   decl {Master *master;} {}
  114.  
  115. class PSlider {: {public Fl_Slider}
  116. } {
  117.   Function {PSlider(int x,int y, int w, int h, const char *label=0):Fl_Slider(x,y,w,h,label)} {} {}
  118.   Function {handle(int event)} {return_type int
  119.   } {
  120.     code {int X=x(),Y=y(),W=w(),H=h();
  121.  
  122. if ((!Fl::event_buttons())|| (event==0)||(Fl::event_shift()==0)) return(Fl_Slider::handle(event));
  123.  
  124. if (!Fl::event_inside(X,Y,W,H)) {
  125.     if (event==FL_DRAG){
  126.         Fl_Slider::handle(FL_RELEASE);
  127.         Fl_Slider::handle(FL_LEAVE);
  128.         deactivate();
  129.         activate();
  130.         return(1);    
  131.     }else{
  132.         return(Fl_Slider::handle(event));
  133.     };
  134. } else {
  135.     //Fl_Slider::handle(FL_FOCUS);
  136.     Fl_Slider::handle(FL_PUSH);
  137. };
  138.  
  139. return(1);} {}
  140.   }
  141.  
  142. class Oscilloscope {: {public Fl_Box}
  143. } {
  144.   Function {Oscilloscope(int x,int y, int w, int h, const char *label=0):Fl_Box(x,y,w,h,label)} {} {
  145.     code {oscil=NULL;
  146. phase=64;
  147. oscbase=0;} {}
  148.   }
  149.   Function {init(OscilGen *oscil_,Master *master_)} {} {
  150.     code {oscil=oscil_;
  151. master=master_;} {}
  152.   }
  153.   Function {init(OscilGen *oscil_,int oscbase_,Master *master_)} {} {
  154.     code {oscil=oscil_;
  155. oscbase=oscbase_;
  156. master=master_;} {}
  157.   }
  158.   Function {init(OscilGen *oscil_,int oscbase_,int phase_,Master *master_)} {} {
  159.     code {oscil=oscil_;
  160. oscbase=oscbase_;
  161. phase=phase_;
  162. master=master_;} {}
  163.   }
  164.   Function {draw()} {} {
  165.     code {int ox=x(),oy=y(),lx=w(),ly=h()-1,i;
  166. REALTYPE smps[OSCIL_SIZE];
  167. pthread_mutex_lock(&master->mutex);
  168. if (oscbase==0) oscil->get(smps,-1.0);
  169.     else oscil->getcurrentbasefunction(smps);
  170. pthread_mutex_unlock(&master->mutex);
  171.  
  172. if (damage()!=1){
  173.  fl_color(0,0,0);
  174.  fl_rectf(ox,oy,lx,ly);
  175. };
  176.  
  177. //normalize
  178. REALTYPE max=0;
  179. for (i=0;i<OSCIL_SIZE;i++)
  180.    if (max<fabs(smps[i])) max=fabs(smps[i]);
  181. //fprintf(stderr,"%.4f\\n",max);
  182. if (max<0.00001) max=1.0;
  183. max=-max*1.05;
  184.  
  185. //draw
  186. fl_line_style(FL_DASH);
  187. if (this->active_r()) fl_color(this->parent()->labelcolor());
  188.     else fl_color(this->parent()->color());
  189. int GX=16;if (lx<GX*3) GX=-1;
  190. for (i=1;i<GX;i++){
  191.    int tmp=(int)(lx/(REALTYPE)GX*i);
  192.    fl_line(ox+tmp,oy+2,ox+tmp,oy+ly-2);
  193. };
  194. int GY=8;if (ly<GY*3) GY=-1;
  195. for (i=1;i<GY;i++){
  196.    int tmp=(int)(ly/(REALTYPE)GY*i);
  197.    fl_line(ox+2,oy+tmp,ox+lx-2,oy+tmp);
  198. };
  199.  
  200. //draw the function
  201. fl_line_style(0,1);
  202. fl_line(ox+2,oy+ly/2,ox+lx-2,oy+ly/2);
  203. if (this->active_r()) fl_color(this->parent()->selection_color());
  204.     else fl_color(this->parent()->labelcolor());
  205. int lw=1;
  206. //if ((lx<135)||(ly<135)) lw=1;
  207. fl_line_style(0,lw);
  208. int ph=(int)((phase-64.0)/128.0*OSCIL_SIZE+OSCIL_SIZE);
  209. for (i=1;i<lx;i++){
  210.    int k1=(int)((REALTYPE)OSCIL_SIZE*(i-1)/lx)+ph;
  211.    int k2=(int)((REALTYPE)OSCIL_SIZE*i/lx)+ph;
  212.    REALTYPE y1=smps[k1%OSCIL_SIZE]/max;
  213.    REALTYPE y2=smps[k2%OSCIL_SIZE]/max;
  214.    fl_line(i-1+ox,(int)(y1*ly/2.0)+oy+ly/2,i+ox,(int)(y2*ly/2.0)+oy+ly/2);
  215. };} {}
  216.   }
  217.   decl {OscilGen *oscil;} {}
  218.   decl {int oscbase;} {}
  219.   decl {int phase;} {public
  220.   }
  221.   decl {Master *master;} {}
  222.  
  223. class Oscilharmonic {: {public Fl_Group}
  224. } {
  225.   Function {make_window()} {private
  226.   } {
  227.     Fl_Window harmonic {
  228.       private xywh {328 166 90 225} type Double hide
  229.       class Fl_Group
  230.     } {
  231.       Fl_Slider mag {
  232.         callback {int x=64;
  233. if (Fl::event_button3()) o->value(x);
  234.    else x=127-(int)o->value();
  235. if (x==64) o->selection_color(0);
  236.     else o->selection_color(222);
  237.  
  238. pthread_mutex_lock(&master->mutex);
  239.  oscil->Phmag[n]=x;
  240.  if (x==64) {
  241.     oscil->Phphase[n]=64;
  242.     phase->value(64);
  243.  };
  244.  oscil->prepare();
  245. pthread_mutex_unlock(&master->mutex);
  246.  
  247. display->redraw();
  248. oldosc->redraw();
  249. if (cbwidget!=NULL) {
  250.     cbwidget->do_callback();
  251.     applybutton->color(FL_RED);
  252.     applybutton->redraw();
  253. };}
  254.         xywh {0 15 15 115} type {Vert Knob} box FLAT_BOX selection_color 222 labelcolor 0 maximum 127 step 1 value 64
  255.         code0 {o->value(127-oscil->Phmag[n]);}
  256.         code1 {if (oscil->Phmag[n]==64) o->selection_color(0);}
  257.         class PSlider
  258.       }
  259.       Fl_Slider phase {
  260.         callback {int x=64;
  261. if (Fl::event_button3()) o->value(x);
  262.    else x=(int)o->value();
  263.  
  264. pthread_mutex_lock(&master->mutex);
  265.  oscil->Phphase[n]=x;
  266.  oscil->prepare();
  267. pthread_mutex_unlock(&master->mutex);
  268.  
  269. display->redraw();
  270. oldosc->redraw();
  271. if (cbwidget!=NULL) {
  272.     cbwidget->do_callback();
  273.     applybutton->color(FL_RED);
  274.     applybutton->redraw();
  275. };}
  276.         xywh {0 135 15 75} type {Vert Knob} box FLAT_BOX selection_color 222 maximum 127 step 1 value 64
  277.         code0 {o->value(oscil->Phphase[n]);}
  278.         class PSlider
  279.       }
  280.       Fl_Box {} {
  281.         xywh {15 70 5 5} box FLAT_BOX color 45
  282.       }
  283.       Fl_Box {} {
  284.         xywh {15 170 5 5} box FLAT_BOX color 45
  285.       }
  286.       Fl_Box {} {
  287.         label 01
  288.         xywh {0 210 20 15} labelfont 1 labelsize 9 align 20
  289.         code0 {char tmp[10];snprintf(tmp,10,"%d",n+1);o->label(strdup(tmp));}
  290.       }
  291.       Fl_Box {} {
  292.         label 01
  293.         xywh {0 0 20 15} labelfont 1 labelsize 9 align 20
  294.         code0 {char tmp[10];snprintf(tmp,10,"%d",n+1);o->label(strdup(tmp));}
  295.       }
  296.     }
  297.   }
  298.   Function {Oscilharmonic(int x,int y, int w, int h, const char *label=0):Fl_Group(x,y,w,h,label)} {} {
  299.     code {n=0;
  300. oscil=NULL;
  301. display=NULL;
  302. applybutton=NULL;
  303. cbwidget=NULL;} {}
  304.   }
  305.   Function {init(OscilGen *oscil_,int n_,Fl_Group *display_,Fl_Widget *oldosc_,Fl_Widget *cbwidget_,Fl_Widget *applybutton_, Master *master_)} {} {
  306.     code {oscil=oscil_;
  307. n=n_;
  308. display=display_;
  309. master=master_;
  310. oldosc=oldosc_;
  311. cbwidget=cbwidget_;
  312. applybutton=applybutton_;
  313. make_window();
  314. end();
  315. harmonic->show();} {}
  316.   }
  317.   Function {refresh()} {} {
  318.     code {mag->value(127-oscil->Phmag[n]);
  319. phase->value(oscil->Phphase[n]);
  320.  
  321. if (oscil->Phmag[n]==64) mag->selection_color(0);
  322.     else mag->selection_color(222);} {}
  323.   }
  324.   Function {~Oscilharmonic()} {} {
  325.     code {harmonic->hide();
  326. //delete(harmonic);} {}
  327.   }
  328.   decl {OscilGen *oscil;} {}
  329.   decl {Fl_Group *display;} {}
  330.   decl {int n;} {}
  331.   decl {Fl_Widget *oldosc,*cbwidget,*applybutton;} {}
  332.   decl {Master *master;} {}
  333.  
  334. class OscilEditor {: {public PresetsUI_}
  335. } {
  336.   Function {make_window()} {} {
  337.     Fl_Window osceditUI {
  338.       label {ADsynth Oscillator Editor}
  339.       xywh {131 90 735 595} type Double hide
  340.       code0 {if (oscil->ADvsPAD) o->label("PADsynth Harmonic Content Editor");}
  341.     } {
  342.       Fl_Button applybutton {
  343.         label Apply
  344.         callback {applybutton->color(FL_GRAY);
  345. applybutton->redraw();
  346. if (cbapplywidget!=NULL) {
  347.     cbapplywidget->do_callback();
  348.     cbapplywidget->color(FL_GRAY);
  349.     cbapplywidget->redraw();
  350. };} selected
  351.         xywh {300 280 60 20} box THIN_UP_BOX labelfont 1
  352.         code0 {if (!oscil->ADvsPAD) o->hide();}
  353.       }
  354.       Fl_Group oscildisplaygroup {
  355.         xywh {5 5 360 300} box ENGRAVED_FRAME
  356.       } {
  357.         Fl_Group {} {open
  358.           xywh {10 85 350 190} box THIN_DOWN_BOX color 32 selection_color 71 labelcolor 179
  359.           code0 {Oscilloscope *osc=new Oscilloscope(o->x(),o->y(),o->w(),o->h(),"");}
  360.           code1 {osc->init(oscil,master);}
  361.         } {}
  362.         Fl_Box {} {
  363.           label Oscillator
  364.           xywh {120 10 110 20} box FLAT_BOX labelfont 1
  365.         }
  366.         Fl_Value_Slider rndslider {
  367.           label rnd
  368.           callback {oscil->Prand=(int)o->value()+64;
  369. oscildisplaygroup->redraw();
  370. oldosc->redraw();}
  371.           tooltip {Oscilator Phase Randomness: smaller than 0 is "group", larger than 0 is for each harmonic} xywh {140 285 100 10} type {Horz Knob} box FLAT_BOX labelsize 10 align 5 minimum -64 maximum 63 step 1
  372.           code0 {if (oscil->ADvsPAD) o->hide();}
  373.         }
  374.         Fl_Group {} {open
  375.           xywh {10 30 350 50} box THIN_DOWN_BOX color 32 selection_color 218 labelcolor 63
  376.           code0 {OscilSpectrum *spc=new OscilSpectrum(o->x(),o->y(),o->w(),o->h(),"");}
  377.           code1 {spc->init(oscil,0,master);}
  378.         } {}
  379.         Fl_Group {} {
  380.           xywh {246 277 115 25} box ENGRAVED_BOX
  381.           code0 {if (oscil->ADvsPAD) o->hide();}
  382.         } {
  383.           Fl_Choice hrndtype {
  384.             label {H.rnd}
  385.             callback {oscil->Pamprandtype=(int) o->value();}
  386.             tooltip {Harmonic Amplitude Randomness} xywh {281 282 50 15} down_box BORDER_BOX labelsize 10 textsize 10
  387.           } {
  388.             menuitem {} {
  389.               label None
  390.               xywh {60 60 100 20} labelfont 1 labelsize 10
  391.             }
  392.             menuitem {} {
  393.               label Pow
  394.               xywh {70 70 100 20} labelfont 1 labelsize 10
  395.             }
  396.             menuitem {} {
  397.               label Sin
  398.               xywh {80 80 100 20} labelfont 1 labelsize 10
  399.             }
  400.           }
  401.           Fl_Dial hrnddial {
  402.             callback {oscil->Pamprandpower=(int) o->value();}
  403.             tooltip {Oscillator's spectrum adjust parameter} xywh {338 280 18 18} maximum 127 step 1
  404.             class WidgetPDial
  405.           }
  406.         }
  407.       }
  408.       Fl_Box {} {
  409.         label {Base Func.}
  410.         xywh {495 15 110 20} box FLAT_BOX labelfont 1
  411.       }
  412.       Fl_Group basefuncdisplaygroup {
  413.         xywh {365 5 360 300} box ENGRAVED_FRAME
  414.       } {
  415.         Fl_Group {} {
  416.           xywh {370 85 350 190} box THIN_DOWN_BOX color 32 selection_color 71 labelcolor 179
  417.           code0 {Oscilloscope *osc=new Oscilloscope(o->x(),o->y(),o->w(),o->h(),"");}
  418.           code1 {osc->init(oscil,1,master);}
  419.         } {}
  420.         Fl_Dial bfslider {
  421.           callback {oscil->Pbasefuncpar=(int)o->value()+64;
  422. basefuncdisplaygroup->redraw();
  423. bfparval->value(oscil->Pbasefuncpar-64);
  424.  
  425. redrawoscil();}
  426.           tooltip {Base Function Parameter} xywh {520 280 20 20} minimum -64 maximum 63 step 1
  427.           class WidgetPDial
  428.         }
  429.         Fl_Choice bftype {
  430.           label {Base.F..}
  431.           callback {oscil->Pcurrentbasefunc=(int) o->value();
  432.  
  433. basefuncdisplaygroup->redraw();
  434. redrawoscil();
  435.  
  436. if ((oscil->Pcurrentbasefunc==0)||(oscil->Pcurrentbasefunc==127)) basefuncmodulation->deactivate();
  437.       else basefuncmodulation->activate();}
  438.           xywh {370 285 90 15} down_box BORDER_BOX labelsize 10 align 5 textsize 12
  439.         } {
  440.           menuitem {} {
  441.             label Sine
  442.             xywh {10 10 100 20} labelfont 1 labelsize 12
  443.           }
  444.           menuitem {} {
  445.             label Triangle
  446.             xywh {20 20 100 20} labelfont 1 labelsize 12
  447.           }
  448.           menuitem {} {
  449.             label Pulse
  450.             xywh {30 30 100 20} labelfont 1 labelsize 12
  451.           }
  452.           menuitem {} {
  453.             label Saw
  454.             xywh {40 40 100 20} labelfont 1 labelsize 12
  455.           }
  456.           menuitem {} {
  457.             label Power
  458.             xywh {50 50 100 20} labelfont 1 labelsize 12
  459.           }
  460.           menuitem {} {
  461.             label Gauss
  462.             xywh {50 50 100 20} labelfont 1 labelsize 12
  463.           }
  464.           menuitem {} {
  465.             label Diode
  466.             xywh {60 60 100 20} labelfont 1 labelsize 12
  467.           }
  468.           menuitem {} {
  469.             label AbsSine
  470.             xywh {70 70 100 20} labelfont 1 labelsize 12
  471.           }
  472.           menuitem {} {
  473.             label PulseSine
  474.             xywh {80 80 100 20} labelfont 1 labelsize 12
  475.           }
  476.           menuitem {} {
  477.             label StrchSine
  478.             xywh {90 90 100 20} labelfont 1 labelsize 12
  479.           }
  480.           menuitem {} {
  481.             label Chirp
  482.             xywh {100 100 100 20} labelfont 1 labelsize 12
  483.           }
  484.           menuitem {} {
  485.             label AbsStrSine
  486.             xywh {102 102 100 20} labelfont 1 labelsize 12
  487.           }
  488.           menuitem {} {
  489.             label Chebyshev
  490.             xywh {112 112 100 20} labelfont 1 labelsize 12
  491.           }
  492.           menuitem {} {
  493.             label Sqr
  494.             xywh {122 122 100 20} labelfont 1 labelsize 12
  495.           }
  496.         }
  497.         Fl_Box {} {
  498.           label {Base Func.}
  499.           xywh {480 10 110 20} box FLAT_BOX labelfont 1
  500.         }
  501.         Fl_Group {} {open
  502.           xywh {370 30 350 50} box THIN_DOWN_BOX color 32 selection_color 218 labelcolor 63
  503.           code0 {OscilSpectrum *spc=new OscilSpectrum (o->x(),o->y(),o->w(),o->h(),"");}
  504.           code1 {spc->init(oscil,1,master);}
  505.         } {}
  506.         Fl_Value_Output bfparval {
  507.           label {Par.}
  508.           xywh {490 285 25 15} labelsize 13 minimum -63 maximum 63 step 1
  509.         }
  510.         Fl_Group basefuncmodulation {
  511.           xywh {550 276 169 25} box ENGRAVED_BOX
  512.           code0 {if ((oscil->Pcurrentbasefunc==0)||(oscil->Pcurrentbasefunc==127)) basefuncmodulation->deactivate();}
  513.         } {
  514.           Fl_Choice bfmodtype {
  515.             label {B.F.Mod.}
  516.             callback {oscil->Pbasefuncmodulation=(int) o->value();
  517. basefuncdisplaygroup->redraw();
  518. redrawoscil();}
  519.             tooltip {Base function modulation} xywh {599 281 50 15} down_box BORDER_BOX labelsize 10 textsize 10
  520.           } {
  521.             menuitem {} {
  522.               label None
  523.               xywh {50 50 100 20} labelfont 1 labelsize 10
  524.             }
  525.             menuitem {} {
  526.               label Rev
  527.               xywh {60 60 100 20} labelfont 1 labelsize 10
  528.             }
  529.             menuitem {} {
  530.               label Sine
  531.               xywh {70 70 100 20} labelfont 1 labelsize 10
  532.             }
  533.             menuitem {} {
  534.               label Pow
  535.               xywh {80 80 100 20} labelfont 1 labelsize 10
  536.             }
  537.           }
  538.           Fl_Dial bfmodpar1 {
  539.             callback {oscil->Pbasefuncmodulationpar1=(int)o->value();
  540. basefuncdisplaygroup->redraw();
  541. redrawoscil();}
  542.             tooltip {Oscillator's modulation parameter 1} xywh {659 281 15 15} maximum 127 step 1
  543.             class WidgetPDial
  544.           }
  545.           Fl_Dial bfmodpar2 {
  546.             callback {oscil->Pbasefuncmodulationpar2=(int)o->value();
  547. basefuncdisplaygroup->redraw();
  548. redrawoscil();}
  549.             tooltip {Oscillator's modulation parameter 2} xywh {679 281 15 15} maximum 127 step 1
  550.             class WidgetPDial
  551.           }
  552.           Fl_Dial bfmodpar3 {
  553.             callback {oscil->Pbasefuncmodulationpar3=(int)o->value();
  554. basefuncdisplaygroup->redraw();
  555. redrawoscil();}
  556.             tooltip {Oscillator's modulation parameter 3} xywh {699 281 15 15} maximum 127 step 1
  557.             class WidgetPDial
  558.           }
  559.         }
  560.       }
  561.       Fl_Choice magtype {
  562.         label {Mag.Type}
  563.         callback {oscil->Phmagtype=(int) o->value();
  564. basefuncdisplaygroup->redraw();
  565.  
  566. redrawoscil();}
  567.         xywh {70 280 65 20} down_box BORDER_BOX labelsize 12 textsize 12
  568.       } {
  569.         menuitem {} {
  570.           label Linear
  571.           xywh {0 0 100 20} labelfont 1 labelsize 12
  572.         }
  573.         menuitem {} {
  574.           label {-40dB}
  575.           xywh {10 10 100 20} labelfont 1 labelsize 12
  576.         }
  577.         menuitem {} {
  578.           label {-60dB}
  579.           xywh {20 20 100 20} labelfont 1 labelsize 12
  580.         }
  581.         menuitem {} {
  582.           label {-80dB}
  583.           xywh {30 30 100 20} labelfont 1 labelsize 12
  584.         }
  585.         menuitem {} {
  586.           label {-100dB}
  587.           xywh {40 40 100 20} labelfont 1 labelsize 12
  588.         }
  589.       }
  590.       Fl_Button {} {
  591.         label {Use as base}
  592.         callback {oscil->useasbase();
  593. if (autoclearbutton->value()){
  594.    for (int i=0;i<MAX_AD_HARMONICS;i++){
  595.       h[i]->mag->value(64);
  596.       oscil->Phmag[i]=64;
  597.       h[i]->phase->value(64);
  598.       oscil->Phphase[i]=64;
  599.    };
  600.    oscil->Phmag[0]=127;
  601.  
  602.    oscil->Pharmonicshift=0;
  603.    harmonicshiftcounter->value(0);
  604.  
  605.    h[0]->mag->value(0);
  606.    wshbutton->value(0);
  607.    wshbutton->do_callback();
  608.    fltbutton->value(0);
  609.    fltbutton->do_callback();
  610.    sabutton->value(0);
  611.    sabutton->do_callback();
  612. };
  613.  
  614. pthread_mutex_lock(&master->mutex);
  615.  for (int i=0;i<MAX_AD_HARMONICS;i++){
  616.    if (oscil->Phmag[i]==64) h[i]->mag->selection_color(0);
  617.       else h[i]->mag->selection_color(222);
  618.  };
  619.  oscil->prepare();
  620. pthread_mutex_unlock(&master->mutex);
  621.  
  622. basefuncdisplaygroup->redraw();
  623. redrawoscil();}
  624.         tooltip {Use this Oscillator as base function} xywh {5 313 85 20} box THIN_UP_BOX labelfont 1 labelsize 12
  625.       }
  626.       Fl_Button {} {
  627.         label Close
  628.         callback {osceditUI->hide();}
  629.         xywh {668 565 62 25} box THIN_UP_BOX
  630.       }
  631.       Fl_Button {} {
  632.         label Clear
  633.         callback {if (!fl_ask("Clear the harmonics settings?")) return;
  634.  
  635. for (int i=0;i<MAX_AD_HARMONICS;i++){
  636.     h[i]->mag->value(64);
  637.     oscil->Phmag[i]=64;
  638.     h[i]->phase->value(64);
  639.     oscil->Phphase[i]=64;
  640. };
  641. oscil->Phmag[0]=127;
  642. h[0]->mag->value(0);
  643.  
  644. for (int i=0;i<MAX_AD_HARMONICS;i++){
  645.   if (oscil->Phmag[i]==64) h[i]->mag->selection_color(0);
  646.      else h[i]->mag->selection_color(222);
  647. };
  648.  
  649. //harmonics->redraw();
  650.  
  651. pthread_mutex_lock(&master->mutex);
  652.  oscil->prepare();
  653. pthread_mutex_unlock(&master->mutex);
  654.  
  655. redrawoscil();}
  656.         xywh {670 505 55 15} box THIN_UP_BOX labelfont 1 labelsize 12
  657.       }
  658.       Fl_Group {} {
  659.         xywh {135 308 150 30} box ENGRAVED_BOX
  660.       } {
  661.         Fl_Choice wshbutton {
  662.           label {Wsh.}
  663.           callback {oscil->Pwaveshapingfunction=(int) o->value();
  664. basefuncdisplaygroup->redraw();
  665. redrawoscil();} open
  666.           tooltip {Waveshaping function} xywh {165 313 55 20} down_box BORDER_BOX labelsize 10 textsize 10
  667.         } {
  668.           menuitem {} {
  669.             label None
  670.             xywh {25 25 100 20} labelfont 1 labelsize 10
  671.           }
  672.           menuitem {} {
  673.             label Atan
  674.             xywh {35 35 100 20} labelfont 1 labelsize 10
  675.           }
  676.           menuitem {} {
  677.             label Asym1
  678.             xywh {45 45 100 20} labelfont 1 labelsize 10
  679.           }
  680.           menuitem {} {
  681.             label Pow
  682.             xywh {55 55 100 20} labelfont 1 labelsize 10
  683.           }
  684.           menuitem {} {
  685.             label Sine
  686.             xywh {65 65 100 20} labelfont 1 labelsize 10
  687.           }
  688.           menuitem {} {
  689.             label Qnts
  690.             xywh {75 75 100 20} labelfont 1 labelsize 10
  691.           }
  692.           menuitem {} {
  693.             label Zigzg
  694.             xywh {85 85 100 20} labelfont 1 labelsize 10
  695.           }
  696.           menuitem {} {
  697.             label Lmt
  698.             xywh {95 95 100 20} labelfont 1 labelsize 10
  699.           }
  700.           menuitem {} {
  701.             label LmtU
  702.             xywh {105 105 100 20} labelfont 1 labelsize 10
  703.           }
  704.           menuitem {} {
  705.             label LmtL
  706.             xywh {115 115 100 20} labelfont 1 labelsize 10
  707.           }
  708.           menuitem {} {
  709.             label ILmt
  710.             xywh {127 127 100 20} labelfont 1 labelsize 10
  711.           }
  712.           menuitem {} {
  713.             label Clip
  714.             xywh {137 137 100 20} labelfont 1 labelsize 10
  715.           }
  716.           menuitem {} {
  717.             label Asym2
  718.             xywh {85 85 100 20} labelfont 1 labelsize 10
  719.           }
  720.           menuitem {} {
  721.             label Pow2
  722.             xywh {95 95 100 20} labelfont 1 labelsize 10
  723.           }
  724.           menuitem {} {
  725.             label Sgm
  726.             xywh {90 90 100 20} labelfont 1 labelsize 10
  727.           }
  728.         }
  729.         Fl_Dial wshpar {
  730.           callback {oscil->Pwaveshaping=(int)o->value()+64;
  731. wsparval->value(oscil->Pwaveshaping-64);
  732. redrawoscil();}
  733.           tooltip {Waveshaping Parameter} xywh {260 313 20 20} minimum -64 maximum 63 step 1
  734.           class WidgetPDial
  735.         }
  736.         Fl_Value_Output wsparval {
  737.           xywh {228 316 25 15} labelsize 13 minimum -63 maximum 63 step 1
  738.         }
  739.       }
  740.       Fl_Light_Button autoclearbutton {
  741.         label {Clr.}
  742.         tooltip {Auto clear when using the oscillator as base function} xywh {95 313 35 20} box THIN_UP_BOX value 1 labelfont 1 labelsize 10
  743.       }
  744.       Fl_Group {} {
  745.         xywh {285 308 155 30} box ENGRAVED_BOX
  746.       } {
  747.         Fl_Choice fltbutton {
  748.           label Filter
  749.           callback {oscil->Pfiltertype=(int) o->value();
  750.  
  751. redrawoscil();}
  752.           tooltip {Oscillator's filter type} xywh {315 313 50 20} down_box BORDER_BOX labelsize 10 textsize 10
  753.         } {
  754.           menuitem {} {
  755.             label None
  756.             xywh {35 35 100 20} labelfont 1 labelsize 10
  757.           }
  758.           menuitem {} {
  759.             label LP1
  760.             xywh {45 45 100 20} labelfont 1 labelsize 10
  761.           }
  762.           menuitem {} {
  763.             label HP1a
  764.             xywh {55 55 100 20} labelfont 1 labelsize 10
  765.           }
  766.           menuitem {} {
  767.             label HP1b
  768.             xywh {65 65 100 20} labelfont 1 labelsize 10
  769.           }
  770.           menuitem {} {
  771.             label BP1
  772.             xywh {75 75 100 20} labelfont 1 labelsize 10
  773.           }
  774.           menuitem {} {
  775.             label BS1
  776.             xywh {85 85 100 20} labelfont 1 labelsize 10
  777.           }
  778.           menuitem {} {
  779.             label LP2
  780.             xywh {55 55 100 20} labelfont 1 labelsize 10
  781.           }
  782.           menuitem {} {
  783.             label HP2
  784.             xywh {65 65 100 20} labelfont 1 labelsize 10
  785.           }
  786.           menuitem {} {
  787.             label BP2
  788.             xywh {65 65 100 20} labelfont 1 labelsize 10
  789.           }
  790.           menuitem {} {
  791.             label BS2
  792.             xywh {75 75 100 20} labelfont 1 labelsize 10
  793.           }
  794.           menuitem {} {
  795.             label Cos
  796.             xywh {75 75 100 20} labelfont 1 labelsize 10
  797.           }
  798.           menuitem {} {
  799.             label Sin
  800.             xywh {85 85 100 20} labelfont 1 labelsize 10
  801.           }
  802.           menuitem {} {
  803.             label LSh
  804.             xywh {95 95 100 20} labelfont 1 labelsize 10
  805.           }
  806.           menuitem {} {
  807.             label S
  808.             xywh {105 105 100 20} labelfont 1 labelsize 10
  809.           }
  810.         }
  811.         Fl_Dial filtervalue1 {
  812.           callback {oscil->Pfilterpar1=(int)o->value();
  813.  
  814. redrawoscil();}
  815.           tooltip {Oscillator's filter parameter1} xywh {367 313 20 20} maximum 127 step 1
  816.           class WidgetPDial
  817.         }
  818.         Fl_Check_Button filterpref {
  819.           label p
  820.           callback {oscil->Pfilterbeforews=(int)o->value();
  821.  
  822. redrawoscil();}
  823.           tooltip {Apply the filter before the waveshaping} xywh {415 313 20 20} down_box DOWN_BOX labelsize 10 align 24
  824.         }
  825.         Fl_Dial filtervalue2 {
  826.           callback {oscil->Pfilterpar2=(int)o->value();
  827.  
  828. redrawoscil();}
  829.           tooltip {Oscillator's filter parameter2} xywh {392 313 20 20} maximum 127 step 1
  830.           class WidgetPDial
  831.         }
  832.       }
  833.       Fl_Group {} {
  834.         xywh {590 308 135 30} box ENGRAVED_BOX
  835.       } {
  836.         Fl_Choice sabutton {
  837.           label {Sp.adj.}
  838.           callback {oscil->Psatype=(int) o->value();
  839. redrawoscil();}
  840.           tooltip {Oscillator's spectrum adjust} xywh {630 313 60 20} down_box BORDER_BOX labelsize 10 textsize 10
  841.         } {
  842.           menuitem {} {
  843.             label None
  844.             xywh {55 55 100 20} labelfont 1 labelsize 10
  845.           }
  846.           menuitem {} {
  847.             label Pow
  848.             xywh {65 65 100 20} labelfont 1 labelsize 10
  849.           }
  850.           menuitem {} {
  851.             label ThrsD
  852.             xywh {75 75 100 20} labelfont 1 labelsize 10
  853.           }
  854.           menuitem {} {
  855.             label ThrsU
  856.             xywh {85 85 100 20} labelfont 1 labelsize 10
  857.           }
  858.         }
  859.         Fl_Dial sadjpar {
  860.           callback {oscil->Psapar=(int)o->value();
  861. redrawoscil();}
  862.           tooltip {Oscillator's spectrum adjust parameter} xywh {695 313 20 20} maximum 127 step 1
  863.           class WidgetPDial
  864.         }
  865.       }
  866.       Fl_Group {} {
  867.         xywh {665 340 65 65} box ENGRAVED_BOX
  868.       } {
  869.         Fl_Counter harmonicshiftcounter {
  870.           label {Harmonic Shift}
  871.           callback {oscil->Pharmonicshift=(int)o->value();
  872. redrawoscil();}
  873.           xywh {670 365 55 15} type Simple labelsize 10 align 129 minimum -64 maximum 64 step 1 textfont 1 textsize 10
  874.         }
  875.         Fl_Check_Button harmonicshiftpre {
  876.           label preH
  877.           callback {oscil->Pharmonicshiftfirst=(int)o->value();
  878. redrawoscil();}
  879.           tooltip {Apply the harmonic shift before the waveshaping and filtering} xywh {690 385 34 15} down_box DOWN_BOX labelsize 10 align 24
  880.         }
  881.         Fl_Button {} {
  882.           label R
  883.           callback {oscil->Pharmonicshift=0;
  884. harmonicshiftcounter->value(0);
  885. redrawoscil();}
  886.           xywh {670 385 20 15} box THIN_UP_BOX labelfont 1 labelsize 10
  887.         }
  888.       }
  889.       Fl_Group {} {
  890.         xywh {665 410 65 90} box ENGRAVED_FRAME
  891.       } {
  892.         Fl_Choice adhrtype {
  893.           label {Adpt.Harm.}
  894.           callback {oscil->Padaptiveharmonics=(int) o->value();
  895. redrawoscil();}
  896.           tooltip {The type of the addaptive harmonics} xywh {670 425 55 15} down_box BORDER_BOX labelsize 10 align 129 when 6 textsize 10
  897.         } {
  898.           menuitem {} {
  899.             label OFF
  900.             xywh {80 80 100 20} labelfont 1 labelsize 10
  901.           }
  902.           menuitem {} {
  903.             label ON
  904.             xywh {90 90 100 20} labelfont 1 labelsize 10
  905.           }
  906.           menuitem {} {
  907.             label Square
  908.             xywh {100 100 100 20} labelfont 1 labelsize 10
  909.           }
  910.           menuitem {} {
  911.             label 2xSub
  912.             xywh {110 110 100 20} labelfont 1 labelsize 10
  913.           }
  914.           menuitem {} {
  915.             label 2xAdd
  916.             xywh {120 120 100 20} labelfont 1 labelsize 10
  917.           }
  918.           menuitem {} {
  919.             label 3xSub
  920.             xywh {120 120 100 20} labelfont 1 labelsize 10
  921.           }
  922.           menuitem {} {
  923.             label 3xAdd
  924.             xywh {130 130 100 20} labelfont 1 labelsize 10
  925.           }
  926.           menuitem {} {
  927.             label 4xSub
  928.             xywh {130 130 100 20} labelfont 1 labelsize 10
  929.           }
  930.           menuitem {} {
  931.             label 4xAdd
  932.             xywh {140 140 100 20} labelfont 1 labelsize 10
  933.           }
  934.         }
  935.         Fl_Dial adhrpow {
  936.           label pow
  937.           callback {oscil->Padaptiveharmonicspower=(int)o->value();
  938. redrawoscil();}
  939.           tooltip {Adaptive harmonics power} xywh {700 460 25 25} labelsize 10 maximum 200 step 1
  940.           class WidgetPDial
  941.         }
  942.         Fl_Dial adhrbf {
  943.           label baseF
  944.           callback {oscil->Padaptiveharmonicsbasefreq=(int)o->value();
  945. redrawoscil();}
  946.           tooltip {Adaptive harmonics base frequency} xywh {670 460 25 25} labelsize 10 maximum 255 step 1
  947.           class WidgetPDial
  948.         }
  949.         Fl_Slider adhrpar {
  950.           callback {oscil->Padaptiveharmonicspar=(int)o->value();
  951. redrawoscil();}
  952.           xywh {670 445 55 10} type {Horz Knob} box FLAT_BOX maximum 100 step 1 value 50
  953.         }
  954.       }
  955.       Fl_Group {} {
  956.         xywh {440 308 150 30} box ENGRAVED_BOX
  957.       } {
  958.         Fl_Choice modtype {
  959.           label {Mod.}
  960.           callback {oscil->Pmodulation=(int) o->value();
  961.  
  962. redrawoscil();}
  963.           tooltip modulation xywh {470 315 50 15} down_box BORDER_BOX labelsize 10 textsize 10
  964.         } {
  965.           menuitem {} {
  966.             label None
  967.             xywh {60 60 100 20} labelfont 1 labelsize 10
  968.           }
  969.           menuitem {} {
  970.             label Rev
  971.             xywh {70 70 100 20} labelfont 1 labelsize 10
  972.           }
  973.           menuitem {} {
  974.             label Sine
  975.             xywh {80 80 100 20} labelfont 1 labelsize 10
  976.           }
  977.           menuitem {} {
  978.             label Pow
  979.             xywh {90 90 100 20} labelfont 1 labelsize 10
  980.           }
  981.         }
  982.         Fl_Dial modpar1 {
  983.           callback {oscil->Pmodulationpar1=(int)o->value();
  984.  
  985. redrawoscil();}
  986.           tooltip {Oscillator's modulation parameter 1} xywh {530 315 15 15} maximum 127 step 1
  987.           class WidgetPDial
  988.         }
  989.         Fl_Dial modpar2 {
  990.           callback {oscil->Pmodulationpar2=(int)o->value();
  991.  
  992. redrawoscil();}
  993.           tooltip {Oscillator's modulation parameter 2} xywh {550 315 15 15} maximum 127 step 1
  994.           class WidgetPDial
  995.         }
  996.         Fl_Dial modpar3 {
  997.           callback {oscil->Pmodulationpar3=(int)o->value();
  998. redrawoscil();}
  999.           tooltip {Oscillator's modulation parameter 3} xywh {570 315 15 15} maximum 127 step 1
  1000.           class WidgetPDial
  1001.         }
  1002.       }
  1003.       Fl_Button {} {
  1004.         label Sine
  1005.         callback {if (!fl_ask("Convert to SINE?")) return;
  1006.  
  1007. pthread_mutex_lock(&master->mutex);
  1008.  oscil->convert2sine(0);
  1009. pthread_mutex_unlock(&master->mutex);
  1010.  
  1011. redrawoscil();
  1012. refresh();}
  1013.         xywh {670 525 55 15} box THIN_UP_BOX labelfont 1 labelsize 12
  1014.       }
  1015.       Fl_Button {} {
  1016.         label C
  1017.         callback {presetsui->copy(oscil);}
  1018.         xywh {670 545 25 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 12 labelcolor 7
  1019.       }
  1020.       Fl_Button {} {
  1021.         label P
  1022.         callback {presetsui->paste(oscil,this);}
  1023.         xywh {700 545 25 15} box THIN_UP_BOX color 179 labelfont 1 labelsize 12 labelcolor 7
  1024.       }
  1025.       Fl_Scroll _this_has_to_be_the_last {
  1026.         xywh {5 340 660 250} type HORIZONTAL box ENGRAVED_BOX
  1027.       } {
  1028.         Fl_Pack harmonics {open
  1029.           xywh {10 345 650 225} type HORIZONTAL
  1030.           code0 {for (int i=0;i<MAX_AD_HARMONICS;i++){h[i]=new Oscilharmonic(0,0,20,o->h(),"");h[i]->init(oscil,i,oscildisplaygroup,oldosc,cbwidget,applybutton,master);}}
  1031.         } {}
  1032.       }
  1033.     }
  1034.   }
  1035.   Function {OscilEditor(OscilGen *oscil_,Fl_Widget *oldosc_,Fl_Widget *cbwidget_,Fl_Widget *cbapplywidget_,Master *master_)} {} {
  1036.     code {oscil=oscil_;
  1037. oldosc=oldosc_;
  1038. cbwidget=cbwidget_;
  1039. cbapplywidget=cbapplywidget_;
  1040. master=master_;
  1041.  
  1042. make_window();
  1043.  
  1044. refresh();
  1045. osceditUI->show();} {}
  1046.   }
  1047.   Function {~OscilEditor()} {} {
  1048.     code {osceditUI->hide();
  1049. //for (int i=0;i<MAX_AD_HARMONICS;i++) delete (h[i]);
  1050. delete (osceditUI);} {}
  1051.   }
  1052.   Function {refresh()} {} {
  1053.     code {magtype->value(oscil->Phmagtype);
  1054. rndslider->value(oscil->Prand-64);
  1055.  
  1056. hrndtype->value(oscil->Pamprandtype);
  1057. hrnddial->value(oscil->Pamprandpower);
  1058.  
  1059. bftype->value(oscil->Pcurrentbasefunc);
  1060. bfparval->value(oscil->Pbasefuncpar-64);
  1061. bfslider->value(oscil->Pbasefuncpar-64);
  1062.  
  1063. bfmodtype->value(oscil->Pbasefuncmodulation);
  1064. bfmodpar1->value(oscil->Pbasefuncmodulationpar1);
  1065. bfmodpar2->value(oscil->Pbasefuncmodulationpar2);
  1066. bfmodpar3->value(oscil->Pbasefuncmodulationpar3);
  1067.  
  1068. wshbutton->value(oscil->Pwaveshapingfunction);
  1069. wsparval->value(oscil->Pwaveshaping-64);
  1070. wshpar->value(oscil->Pwaveshaping-64);
  1071.  
  1072. fltbutton->value(oscil->Pfiltertype);
  1073. filtervalue1->value(oscil->Pfilterpar1);
  1074. filtervalue2->value(oscil->Pfilterpar2);
  1075. filterpref->value(oscil->Pfilterbeforews);
  1076.  
  1077. modtype->value(oscil->Pmodulation);
  1078. modpar1->value(oscil->Pmodulationpar1);
  1079. modpar2->value(oscil->Pmodulationpar2);
  1080. modpar3->value(oscil->Pmodulationpar3);
  1081.  
  1082. sabutton->value(oscil->Psatype);
  1083. sadjpar->value(oscil->Psapar);
  1084.  
  1085. harmonicshiftcounter->value(oscil->Pharmonicshift);
  1086. harmonicshiftpre->value(oscil->Pharmonicshiftfirst);
  1087.  
  1088. adhrtype->value(oscil->Padaptiveharmonics);
  1089. adhrbf->value(oscil->Padaptiveharmonicsbasefreq);
  1090. adhrpow->value(oscil->Padaptiveharmonicspower);
  1091. adhrtype->value(oscil->Padaptiveharmonicspar);
  1092.  
  1093. for (int i=0;i<MAX_AD_HARMONICS;i++) h[i]->refresh();
  1094.  
  1095. pthread_mutex_lock(&master->mutex);
  1096.  oscil->prepare();
  1097. pthread_mutex_unlock(&master->mutex);
  1098.  
  1099. basefuncdisplaygroup->redraw();
  1100. redrawoscil();} {}
  1101.   }
  1102.   Function {redrawoscil()} {} {
  1103.     code {oscildisplaygroup->redraw();
  1104. oldosc->redraw();
  1105. if (cbwidget!=NULL) {
  1106.       cbwidget->do_callback();
  1107.       applybutton->color(FL_RED);
  1108.       applybutton->redraw();
  1109. };} {}
  1110.   }
  1111.   decl {OscilGen *oscil;} {}
  1112.   decl {Fl_Widget *oldosc,*cbwidget,*cbapplywidget;} {}
  1113.   decl {Oscilharmonic *h[MAX_AD_HARMONICS];} {}
  1114.   decl {Master *master;} {}
  1115.